/**
 * @(#)Chino.java
 *
 *
 * @author
 * @version 1.00 2011/11/25
 */
import javax.swing.JProgressBar;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Chino {
	private static ArrayList<Entrada> diccionario;
	private static StringBuffer resultado;

	public static String formatear(String original, String idioma, String traduccion, JProgressBar avance){
		resultado=new StringBuffer();
		resultado.append("<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\">\n");
		resultado.append("\t<tr>\n");
		resultado.append("\t\t<td align=\"center\" width=\"60%\"><b>Chino</b></td>\n");
		resultado.append("\t\t<td align=\"center\" width=\"40%\"><b>Idioma traducido</b></td>\n");
		resultado.append("\t</tr>\n");

		boolean anterior=false;

		StringTokenizer lineas=new StringTokenizer(original, "\n", true);
		while(lineas.hasMoreTokens()){
			String l=lineas.nextToken();

			if(l.equals("\n")){
				if(anterior){
					resultado.append("</table>\n");
					resultado.append("<br>\n");
					resultado.append("<br>\n");
					resultado.append("<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\">\n");
				}else{
					anterior=true;
					continue;
				}
			}else{
				resultado.append("\t<tr>\n");
				resultado.append("\t\t<td align=\"center\" width=\"60%\">\n");

				formatearLinea(l);

				resultado.append("\t\t</td>\n");
				resultado.append("\t\t<td align=\"center\" class=\"traduccion\" width=\"40%\">traduccion</td>\n");
				resultado.append("\t</tr>\n");
				anterior=false;
			}
		}
		resultado.append("</table>");

		return resultado.toString();
	}

	private static void formatearLinea(String linea){
		ArrayList<Entrada> lista=traducirFrase(linea);

		resultado.append("\t\t\t<table>\n");
		resultado.append("\t\t\t\t<tr>\n");

		for(int k=0; k<lista.size(); k++){
			resultado.append("\t\t\t\t\t<td align=\"center\" class=\"romano\">"+lista.get(k).getRomanizacion()+"</td>\n");
		}
		resultado.append("\t\t\t\t</tr>\n");
		resultado.append("\t\t\t\t<tr>\n");

		for(int k=0; k<lista.size(); k++){
			Entrada e=lista.get(k);
			if(e.getTipeado().equals("?")){
				resultado.append("\t\t\t\t\t<td align=\"center\" class=\"chino\">"+e.getSimplificado()+"</td>\n");
			}else if(e.getAcepciones()==null){
				resultado.append("\t\t\t\t\t<td align=\"center\" class=\"chino\"><a href=\"#\" title=\"?\">"+e.getSimplificado()+"</a></td>\n");
			}else{
				resultado.append("\t\t\t\t\t<td align=\"center\" class=\"chino\"><a href=\"#\" title=\""+e.getAcepciones()+"\">"+e.getSimplificado()+"</a></td>\n");
			}
		}
		resultado.append("\t\t\t\t</tr>\n");
		resultado.append("\t\t\t</table>\n");
	}

	private static ArrayList<Entrada> traducirFrase(String frase){
		ArrayList<Entrada> resultado=new ArrayList<Entrada>();

		for(int i=0, p=1; i<frase.length(); i+=p){
			boolean encontrado=false;

//			editor.append("\n");

			for(int t=frase.length(); t>i; t--){
				String cadena=frase.substring(i, t);
//				editor.append(cadena+"\n");
				Entrada e=buscarCadena(cadena, true);

//				if(e==null){
//					e=buscarCadena(cadena, false);
//					System.out.println("No se habia encontrado, y ahora: "+(e==null));
//				}

				if(e!=null){
					resultado.add(e);
//					editor.append(cadena+"\t"+e.getRomanizacion()+"\t"+e.getAcepciones()+"\n");
					encontrado=true;
					p=t-i;
					break;
				}
			}
			if(!encontrado){
				String caracter=frase.substring(i, i+1);
				resultado.add(new Entrada(caracter, caracter, "?", null));
//				editor.append(frase.substring(i, i+1)+"\t?\n");
			}
		}
		return resultado;
	}

	private static Entrada buscarCadena(String cadena, boolean tradicional){
		float mitad=diccionario.size()/2;
		int indice=Math.round(mitad);

//		editor.append("\t"+cadena+"\n");

		while(Math.round(mitad)>0){
			Entrada e=diccionario.get(indice);

			String palabra=null;
			if(tradicional){
				palabra=e.getTradicional();
			}else{
				palabra=e.getSimplificado();
			}

			int comparacion=cadena.compareTo(palabra);

//			editor.append(indice+"\t"+mitad+"\t"+Math.round(mitad)+"\t"+simp+"\n");
			if(comparacion==0){
				return e;
			}else{
				mitad=mitad/2;

				if(comparacion<0){
					indice=indice-Math.round(mitad);
				}else{
					indice=indice+Math.round(mitad);
				}
			}
		}
		return null;
	}
}